#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

typedef void(*task_pointer)();

void task_1()
{
    printf("这是一个网络监测任务, pid:%d\n", getpid());
}


void task_2()
{
    printf("这是一个日志记录任务，pid:%d\n", getpid());
}

void task_3()
{
    printf("这是一个调度任务，pid:%d\n", getpid());
}

#define TASK_NUM 3
task_pointer task[TASK_NUM];

int add_task(task_pointer t);

void init_task()
{
    for(int i=0; i<TASK_NUM; i++)
        task[i] = NULL;

    add_task(task_1);
    add_task(task_2);
    add_task(task_3);
}

int add_task(task_pointer t)
{
    int pos = 0;
    for(pos; pos<TASK_NUM; pos++)
    {
        if(!task[pos])
        {
            task[pos] = t;
            break;
        }
    }
    if(pos == TASK_NUM)
    {
        printf("添加任务失败！\n");
        return -1;
    }
}

void run_task()
{
    init_task();
    for(int i=0; i<TASK_NUM; i++)
        task[i]();
}

void run_child()
{
    int cnt = 3;
    while(cnt--)
    {
        printf("这是一个正在运行的子进程，pid:%d, ppid:%d\n", getpid(), getppid());
        sleep(1);
    }
}

void test_1()
{
    pid_t id = fork();

    if(id == 0)
    {
        //子进程
        run_child(); //运行3秒
        exit(0);
    }
    else if(id < 0)
    {
        perror("创建进程失败！\n");
        exit(-1);
    }
    else
    {
        //父进程
        int status = 0;
        while(1) //进行轮询
        {
            pid_t id = waitpid(-1, &status, WNOHANG); //要进行非阻塞等待
            if(id == 0)
            {
                printf("子进程还在运行中, 先执行其它任务\n");
                run_task();
            }
            else if(id < 0)
            {
                printf("子进程异常终止！终止信号为：%d\n", (status & 0x7f));
                break;
            }
            else
            {
                printf("子进程运行完成，退出码为：%d\n", (status>>8) & 0xff);
                break;
            }

            sleep(1);
        }
    }

    sleep(3); //看状态
    exit(0);

}

int main()
{
    test_1();

    return 0;
}
